home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / xlib / xlib06 / xcbitm32.c < prev    next >
C/C++ Source or Header  |  1993-05-23  |  4KB  |  189 lines

  1. #include "xbmtools.h"
  2.  
  3. /* these are here instead of the header file because they're not part
  4.    of the library interface */
  5.  
  6. // rol al
  7. #define ROL_AL          0xc0d0
  8. // mov [si + disp8], imm8
  9. #define SHORT_STORE_8   0x44c6
  10. // mov [si + disp16], imm8
  11. #define STORE_8         0x84c6
  12. // mov [si + disp8], imm16
  13. #define SHORT_STORE_16  0x44c7
  14. // mov [si + disp16], imm16
  15. #define STORE_16        0x84c7
  16. // adc si, imm8
  17. #define ADC_SI_IMMED    0xd683
  18. // out dx, al
  19. #define OUT_AL          0xee
  20. // ret
  21. #define RETURN          0xcb
  22. // 32-bit prefix
  23. #define DWORD_PREFIX    0x66
  24.  
  25. #define Emitb(x) *(output + output_used) = (x); output_used++
  26.  
  27. #define Emitw(x) *(output + output_used) = (x) & 255; \
  28.                  *(output + output_used + 1) = (x) >> 8; \
  29.                  output_used += 2
  30.  
  31.  
  32. int x_compile_bitmap_32 (int logical_screen_width, char far * bitmap,
  33.                 char far * output)
  34. {
  35.     int pix0, pix1, pix2, pix3, numpix, pos;
  36.     int column = 0, set_column = 0;
  37.     int scanx = 0, scany = 0;
  38.     int output_used = 0;
  39.  
  40.     int height = LBMHeight(bitmap);
  41.     int width = LBMWidth(bitmap);
  42.     int margin = width - 1;
  43.     int margin2 = margin - 4;
  44.     int margin4 = margin - 12;
  45.  
  46.     while (column < 4) {
  47.         numpix = 1;
  48.         pix0 = LBMGetPix(scanx, scany, bitmap);
  49.         if (pix0 != 0) {
  50.             if (set_column != column) {
  51.                 do {
  52.                     Emitw (ROL_AL);
  53.                     Emitw (ADC_SI_IMMED);
  54.                     Emitb (0);
  55.                     set_column++;
  56.                 } while (set_column != column);
  57.                 Emitb (OUT_AL);
  58.             }
  59.             if (scanx <= margin2) {
  60.                 pix1 = LBMGetPix(scanx + 4, scany, bitmap);
  61.                 if ((pix1 != 0)
  62.                   &&(scanx <= margin4)) {
  63.                     numpix = 2;
  64.                     pix2 = LBMGetPix(scanx + 8, scany, bitmap);
  65.                     pix3 = LBMGetPix(scanx + 12, scany, bitmap);
  66.                     if ((pix2 != 0) && (pix3 != 0)) {
  67.                         numpix = 4;
  68.                         Emitb (DWORD_PREFIX);
  69.                     }
  70.                 }
  71.             }
  72.             pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
  73.             if ((pos >= -128) && (pos <= 127)) {
  74.                 if (numpix == 1) {
  75.                     Emitw (SHORT_STORE_8);
  76.                     Emitb (pos);
  77.                     Emitb (pix0);
  78.                 } else {
  79.                     Emitw (SHORT_STORE_16);
  80.                     Emitb (pos);
  81.                     Emitb (pix0);
  82.                     Emitb (pix1);
  83.                     if (numpix == 4) {
  84.                         Emitb (pix2);
  85.                         Emitb (pix3);
  86.                     }
  87.                 }
  88.             } else {
  89.                 if (numpix == 1) {
  90.                     Emitw (STORE_8);
  91.                     Emitw (pos);
  92.                     Emitb (pix0);
  93.                 } else {
  94.                     Emitw (STORE_16);
  95.                     Emitw (pos);
  96.                     Emitb (pix0);
  97.                     Emitb (pix1);
  98.                     if (numpix == 4) {
  99.                         Emitb (pix2);
  100.                         Emitb (pix3);
  101.                     }
  102.                 }
  103.             }
  104.         }
  105.         scanx += (numpix << 2);
  106.         if (scanx > margin) {
  107.             scanx = column;
  108.             scany++;
  109.             if (scany == height) {
  110.                 scany = 0;
  111.                 column++;
  112.             }
  113.         }
  114.     }
  115.     Emitb(RETURN);
  116.     return(output_used);
  117. }
  118.  
  119.  
  120. int x_sizeof_cbitmap_32 (int logical_screen_width, char far * bitmap)
  121. {
  122.     int pix0, pix1, pix2, pix3, numpix, pos;
  123.     int column = 0, set_column = 0;
  124.     int scanx = 0, scany = 0;
  125.     int output_used = 1;
  126.  
  127.     int height = LBMHeight(bitmap);
  128.     int width = LBMWidth(bitmap);
  129.     int margin = width - 1;
  130.     int margin2 = margin - 4;
  131.     int margin4 = margin - 12;
  132.  
  133.     while (column < 4) {
  134.         numpix = 1;
  135.         pix0 = LBMGetPix(scanx, scany, bitmap);
  136.         if (pix0 != 0) {
  137.             if (set_column != column) {
  138.                 do {
  139.                     output_used += 5;
  140.                     set_column++;
  141.                 } while (set_column != column);
  142.                 output_used++;
  143.             }
  144.             if (scanx <= margin2) {
  145.                 pix1 = LBMGetPix(scanx + 4, scany, bitmap);
  146.                 if ((pix1 != 0)
  147.                   &&(scanx <= margin4)) {
  148.                     numpix = 2;
  149.                     pix2 = LBMGetPix(scanx + 8, scany, bitmap);
  150.                     pix3 = LBMGetPix(scanx + 12, scany, bitmap);
  151.                     if ((pix2 != 0) && (pix3 != 0)) {
  152.                         numpix = 4;
  153.                         output_used++;
  154.                     }
  155.                 }
  156.             }
  157.             pos = (scany * logical_screen_width) + (scanx >> 2) - 128;
  158.             if ((pos >= -128) && (pos <= 127)) {
  159.                 if (numpix == 1) {
  160.                     output_used += 4;
  161.                 } else {
  162.                     output_used += 5;
  163.                     if (numpix == 4)
  164.                         output_used += 2;
  165.                 }
  166.             } else {
  167.                 if (numpix == 1) {
  168.                     output_used += 5;
  169.                 } else {
  170.                     output_used += 6;
  171.                     if (numpix == 4)
  172.                         output_used += 2;
  173.                 }
  174.             }
  175.         }
  176.         scanx += (numpix << 2);
  177.         if (scanx > margin) {
  178.             scanx = column;
  179.             scany++;
  180.             if (scany == height) {
  181.                 scany = 0;
  182.                 column++;
  183.             }
  184.         }
  185.     }
  186.     return(output_used);
  187. }
  188.  
  189.